package org.jin.jinaicode.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import org.jin.jinaicode.model.dto.history.ChatHistoryQueryDTO;
import org.jin.jinaicode.model.entity.ChatHistory;
import org.jin.jinaicode.model.entity.User;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 对话历史 服务层。
 *
 * @author 小堇
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 添加消息记录
     * @param appId
     * @param message
     * @param messageType
     * @param userId
     * @return
     */
    boolean addChatMessage(Long appId,String message,String messageType,Long userId);

    /**
     * 删除聊天记录 
     */
    boolean deleteByAppId(Long appId);


    /**
     * 加载历史对话到内存
     * @param appId
     * @param chatMemory
     * @return
     */
    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory,int maxCount);

    /**
     * 构造查询条件
     * @param chatHistoryQueryRequest
     * @return
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryDTO chatHistoryQueryRequest);

    /**
     * 分页查询
     * @param appId
     * @param pageSize
     * @param lastCreateTime
     * @param loginUser
     * @return
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize,
                                               LocalDateTime lastCreateTime,
                                               User loginUser);

    /**
     * 导出应用对话记录为Markdown
     * @param appId 应用ID
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param loginUser 当前用户
     * @return Markdown内容
     */
    String exportChatHistoryToMarkdown(Long appId, LocalDateTime startTime, LocalDateTime endTime, User loginUser);

    /**
     * 获取应用的所有对话记录（用于导出）
     * @param appId 应用ID
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @param loginUser 当前用户
     * @return 对话记录列表
     */
    List<ChatHistory> listAppChatHistoryForExport(Long appId, LocalDateTime startTime, LocalDateTime endTime, User loginUser);
}
